/**
 * @description 二叉树节点
 * @class {BaseBinaryNodeModel}
 * @author hhx
 * @date 2024-11-15 13:11
 * @version 0.1.2
 */
export class BaseBinaryNodeModel {

    /**
     * @description 二叉树的值
     * @private
     * @type {number} 值类型
     */
    _value = undefined;

    /**
     * @description 左子树值
     * @private
     * @type {BaseBinaryNodeModel} 二叉树对象
     */
    _left = null;

    /**
     * @description 右子树值
     * @private
     * @type {BaseBinaryNodeModel} 二叉树对象
     */
    _right = null;

    /**
     * @description 二叉树构造函数
     * @public
     * @constructor
     * @param value {number} 二叉树值
     */
    constructor(value) {
        this._value = value;
    }

    //========================== 内部属性 ==========================

    /**
     * @description 获取 节点值
     * @property
     * @protected
     * @return {number} 节点值
     */
    get value() {
        return this._value;
    }

    /**
     * @description 设置 节点值
     * @property
     * @protected
     * @param value {number} 节点值
     */
    set value(value) {
        this._value = value;
    }

    /**
     * @description 获取 左节点值
     * @property
     * @protected
     * @return {BaseBinaryNodeModel} 左节点值
     */
    get left() {
        return this._left;
    }

    /**
     * @description 设置 左节点值
     * @property
     * @protected
     * @param value {BaseBinaryNodeModel} 左节点值
     */
    set left(value) {
        this._left = value;
    }

    /**
     * @description 获取 右节点值
     * @property
     * @protected
     * @return {BaseBinaryNodeModel} 右节点值
     */
    get right() {
        return this._right;
    }

    /**
     * @description 设置 右节点值
     * @property
     * @protected
     * @param value {BaseBinaryNodeModel} 右节点值
     */
    set right(value) {
        this._right = value;
    }

    //========================== 属性方法 ==========================

    /**
     * @description 获取节点值
     * @public
     * @return {number} 节点值
     */
    getValue() {
        return this.value;
    }

    /**
     * @description 设置节点值
     * @public
     * @param value {number} 节点值
     */
    setValue(value) {
        this.value = value;
    }

    /**
     * @description 获取左节点值
     * @public
     * @return {BaseBinaryNodeModel} 左节点值
     */
    getLeft() {
        return this.left;
    }

    /**
     * @description 设置左节点值
     * @public
     * @param value {BaseBinaryNodeModel} 左节点对象值
     */
    setLeft(value) {
        this.left = value;
    }

    /**
     * @description 获取右节点值
     * @public
     * @return {BaseBinaryNodeModel} 右节点值
     */
    getRight() {
        return this.right;
    }

    /**
     * @description 设置右节点值
     * @public
     * @param value {BaseBinaryNodeModel} 右节点对象值
     */
    setRight(value) {
        this.right = value;
    }

}